package com.ruoyi.aero.service.impl;

import java.util.List;

import com.ruoyi.aero.domain.StaffInfo;
import com.ruoyi.aero.enums.SysPostCode;
import com.ruoyi.aero.service.IStaffInfoService;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.aero.mapper.GroupInfoMapper;
import com.ruoyi.aero.domain.GroupInfo;
import com.ruoyi.aero.service.IGroupInfoService;
import org.springframework.util.ObjectUtils;

/**
 * 班组信息Service业务层处理
 * 
 * @author swb
 * @date 2024-06-04
 */
@Service
public class GroupInfoServiceImpl implements IGroupInfoService 
{
    @Autowired
    private GroupInfoMapper groupInfoMapper;

    @Autowired
    private IStaffInfoService staffInfoService;

    /**
     * 查询班组信息
     * 
     * @param groupId 班组信息主键
     * @return 班组信息
     */
    @Override
    public GroupInfo selectGroupInfoByGroupId(String groupId)
    {
        return groupInfoMapper.selectGroupInfoByGroupId(groupId);
    }

    /**
     * 查询班组信息
     *
     * @param groupNo 班组信息编号
     * @return 班组信息
     */
    @Override
    public GroupInfo selectGroupInfoByGroupNo(String groupNo) {
        return groupInfoMapper.selectGroupInfoByGroupNo(groupNo);
    }

    /**
     * 查询班组信息列表
     * 
     * @param groupInfo 班组信息
     * @return 班组信息
     */
    @Override
    public List<GroupInfo> selectGroupInfoList(GroupInfo groupInfo)
    {
        return groupInfoMapper.selectGroupInfoList(groupInfo);
    }

    /**
     * 新增班组信息
     * 
     * @param groupInfo 班组信息
     * @return 结果
     */
    @Override
    public int insertGroupInfo(GroupInfo groupInfo)
    {
        repeatGroupNo(groupInfo);
        judgeGroupLeader(groupInfo);
        groupInfo.setGroupId(IdUtils.randomUUID());
        groupInfo.setCreateTime(DateUtils.getNowDate());
        groupInfo.setCreateBy(SecurityUtils.getUsername());
        groupInfoMapper.insertGroupInfo(groupInfo);

        String groupId = groupInfo.getGroupId();
        String groupLeaderId = groupInfo.getGroupLeaderId();
        StaffInfo staffInfo = staffInfoService.selectStaffInfoByStaffId(groupLeaderId);
        staffInfo.setGroupId(groupId);
        staffInfo.setWorkshopId(groupInfo.getWorkshopId());
        return staffInfoService.updateStaffInfo(staffInfo);
    }

    /**
     * 修改班组信息
     * 
     * @param groupInfo 班组信息
     * @return 结果
     */
    @Override
    public int updateGroupInfo(GroupInfo groupInfo)
    {
        repeatGroupNo(groupInfo);
        judgeGroupLeader(groupInfo);
        groupInfo.setUpdateTime(DateUtils.getNowDate());
        groupInfo.setUpdateBy(SecurityUtils.getUsername());
        return groupInfoMapper.updateGroupInfo(groupInfo);
    }

    /**
     * 批量删除班组信息
     * 
     * @param groupIds 需要删除的班组信息主键
     * @return 结果
     */
    @Override
    public int deleteGroupInfoByGroupIds(String[] groupIds)
    {
        return groupInfoMapper.deleteGroupInfoByGroupIds(groupIds);
    }

    /**
     * 删除班组信息信息
     * 
     * @param groupId 班组信息主键
     * @return 结果
     */
    @Override
    public int deleteGroupInfoByGroupId(String groupId)
    {
        return groupInfoMapper.deleteGroupInfoByGroupId(groupId);
    }

    /**
     * 判断重复班组编号
     * @param groupInfo
     */
    private void repeatGroupNo(GroupInfo groupInfo) {
        String groupId = groupInfo.getGroupId();
        String groupNo = groupInfo.getGroupNo();
        if (ObjectUtils.isEmpty(groupNo)) {
            throw new ServiceException("班组编码不能为空，操作失败");
        }

        GroupInfo group = selectGroupInfoByGroupNo(groupNo);
        if (ObjectUtils.isEmpty(group)) {
            // 为空则不重复，返回
            return;
        }

        if (ObjectUtils.isEmpty(groupId)) {
            // 添加操作，直接判定重复
            throw new ServiceException("班组编码与已有编码重复，添加失败");
        } else {
            // 修改操作，比较id是否一致
            if (!group.getGroupId().equals(groupId)) {
                // 若id不一致，则判定为重复
                throw new ServiceException("班组编码与已有编码重复，添加失败");
            }
        }
    }

    /**
     * 判断班组负责人
     * @param groupInfo
     */
    private void judgeGroupLeader(GroupInfo groupInfo) {
        String groupId = groupInfo.getGroupId();
        String groupLeaderId = groupInfo.getGroupLeaderId();
        if (ObjectUtils.isEmpty(groupLeaderId)) return;

        StaffInfo staffInfo = staffInfoService.selectStaffInfoByStaffId(groupLeaderId); // 要设置的负责人信息
        String postNo = staffInfo.getPostNo();
        if (!SysPostCode.TEAM_LEADER.getPostCode().equals(postNo)) {
            // 如果不是班组长
            throw new ServiceException("班组负责人的身份必须是班组长");
        }

        if (!ObjectUtils.isEmpty(staffInfo.getGroupId()) && !"无".equals(staffInfo.getGroupId())) {
            throw new ServiceException("此人正在负责其他班组，操作失败");
        }

        // 对于修改操作
        if (!ObjectUtils.isEmpty(groupId)) {
            GroupInfo group = selectGroupInfoByGroupId(groupId);
            if (!groupLeaderId.equals(group.getGroupLeaderId())) {
                // 如果负责人发生改变
                if (!ObjectUtils.isEmpty(group.getGroupLeaderId())) {
                    // 如果之前设置了负责人，则将其班组id置空
                    StaffInfo staff = staffInfoService.selectStaffInfoByStaffId(group.getGroupLeaderId());
                    staff.setGroupId("无");
                    staffInfoService.updateStaffInfo(staff);
                }

                staffInfo.setGroupId(groupId);
                staffInfo.setWorkshopId(groupInfo.getWorkshopId());
                staffInfoService.updateStaffInfo(staffInfo);
            }
        }

    }
}
